#include <cstring>
#include <string>
#include "vl_props.h"

using namespace VL;

int main(int argc, const char** argv) {
	if(argc != 2) {
		return 1;
	}

	VLProp prop;
	try {
		VLProp::readVLP(argv[1], prop, {}, { "YES"});
		if(!prop["a1"].isEmpty()) {
			return 3;
		}
		if(prop["a2"].isEmpty()) {
			return 4;
		}
		if(prop["a2"].intValue() != 1) {
			return 5;
		}
		if(!prop["a4"].isEmpty()) {
			return 6;
		}
		if(!prop["a5"].isEmpty()) {
			return 7;
		}
		if(!prop["b"].isMap()) {
			return 8;
		}
		auto & bProp = prop["b"];
		if(!bProp["a1"].isEmpty()) {
			return 9;
		}
		if(bProp["a2"].isEmpty()) {
			return 10;
		}
		if(bProp["a2"].intValue() != 1) {
			return 11;
		}
		if(!bProp["a4"].isEmpty()) {
			return 12;
		}
		if(!bProp["a5"].isEmpty()) {
			return 13;
		}

		auto & cProp = prop["c"];
		if(!cProp.isArray()) {
			return 14;
		}
		if(cProp.size() != 1) {
			return 15;
		}
		if(cProp[0].intValue() != 2) {
			return 16;
		}

		auto & dProp = prop["d"];
		if(!dProp.isArray()) {
			return 17;
		}
		if(dProp.size() != 7) {
			return 18;
		}
		if(dProp[0].intValue() != 2) {
			return 19;
		}
		if(dProp[1].intValue() != 5) {
			return 20;
		}
		if(dProp[2].intValue() != 6) {
			return 21;
		}
		if(dProp[3].intValue() != 11) {
			return 22;
		}
		if(dProp[4].intValue() != 13) {
			return 23;
		}
		if(dProp[5].intValue() != 14) {
			return 24;
		}
		if(dProp[6].intValue() != 15) {
			return 25;
		}
	} catch(const VLPropExcetion& exception) {
		printf("error: %s\n", exception.message.c_str());
		return 2;
	} catch(...) {
		return 2;
	}

	return 0;
}